/*
 *  Copyright (C) 2012 Компания ВИТ. web: http://diasled.ru Е-mail:  vit@diasled.ru
 * 
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 * 
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 * 
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package ru.apertum.diasled.model.load;

import java.util.concurrent.LinkedBlockingQueue;
import ru.apertum.diasled.common.Uses;
import ru.apertum.diasled.model.Examination;
import ru.apertum.diasled.rxtx.PortUtil;

/**
 * Это загрузчик данных.
 * Загружает данные считываемые от сканера в БД.
 * Стартует два потока. Один читает данные от сканера, другой пишет их в БД.
 * Для каждого обследования отдельно создавать свой загрузчик.
 * @author Evgeniy Egorov, Aperum Projects
 */
public class Loader {

    /**
     * Загрузка данных именно этого обследования
     */
    private final Examination exam;

    public Examination getExam() {
        return exam;
    }
    /**
     * Поток приема данных от сканера
     */
    private final Thread generator;
    /**
     * Поток записи данных в БД
     */
    private final Thread inserter;
    private final Inserter ins;
    private final LinkedBlockingQueue<byte[]> queue;

    public Loader(Examination exam, String portName, int frames) {
        this.exam = exam;
        queue = new LinkedBlockingQueue();
        inserter = new Thread(ins = new Inserter(queue, exam));
        inserter.setDaemon(true);
        generator = new Thread(new Generator(queue, portName, frames));
        generator.setDaemon(true);
    }

    public void start() {
        Uses.log.logger.info("Старт потоков загрузки данных от сканера.");
        inserter.start();
        generator.start();
    }

    public void stop() {
        Uses.log.logger.info("Останов потоков загрузки данных от сканера.");
        PortUtil.stopExam();
    }

    /**
     * Все тормозит и ждет пока докачается от сканера в БД
     * @return 
     */
    public boolean waitResult() {
        while (ins.getResult() != 2 && ins.isWork()) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException ex) {
            }
        }
        return ins.getResult() == 1;
    }

    public boolean getResult() {
        return ins.getResult() == 1;
    }

    /**
     * Состояние вставки 
     * @return 0-впроцессе, 1-успешно завершено, 2-упало.
     */
    public int getRes() {
        return ins.getResult();
    }
}
